package com.util;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import org.apache.commons.lang3.ArrayUtils;
import org.junit.Test;
import sun.misc.BASE64Encoder;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.util.Arrays;

/**
 * @author cxt
 * @date 2020/8/27
 * <p>
 * 给前端产生一个条形码
 * 导入jar包
 * <dependency>
 * <groupId>com.google.zxing</groupId>
 * <artifactId>javase</artifactId>
 * <version>3.3.3</version>
 * </dependency>
 */
public class BarCode {

    /**
     * 产生条形码的方法
     *
     * @param number 编码
     * @param width  宽度
     * @param height 高度
     */
    public static BufferedImage getBarCode(String number, Integer width, Integer height) {
        try {
            BitMatrix bitMatrix = new MultiFormatWriter().encode(number, BarcodeFormat.CODE_128, width, height);
            return MatrixToImageWriter.toBufferedImage(bitMatrix);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 给前端产生一个条形码，以 base64 码的方式返回
     *
     * @param number 编码
     * @param width  宽度
     * @param height 高度
     */
    public static String getCode(String number, Integer width, Integer height) {
        // 生成条形码
        BufferedImage image = getBarCode(number, width, height);
        // 使用流的方式
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 将流转成数组
        byte[] bytes = out.toByteArray();
        BASE64Encoder encoder = new BASE64Encoder();
        // 把生成的编码返回去
        return "data:image/png;base64," + encoder.encodeBuffer(bytes).trim();
    }

    /**
     * 输出二维码方式：本地文件的方式
     *
     * @param number   编码
     * @param width    宽度
     * @param height   高度
     * @param filePath 条形码文件的地址和名字
     */
    public static void localFile(String number, Integer width, Integer height, String filePath) throws IOException {
        BufferedImage bufImg = getBarCode(number, width, height);
        String formatName = filePath.substring(filePath.lastIndexOf(".") + 1);
        if (bufImg != null) {
            ImageIO.write(bufImg, formatName, new File(filePath));
        }
    }

    /**
     * 调用测试
     */
    public static void main(String[] args) throws IOException {
        // 编码的方式产生
//        String code = getCode("1120220202", 150, 150);
//        System.out.println(code);

        // 本地文件的方式
        localFile("1120220202", 150, 150, "D:\\erCode.png");
    }


    @Test
    public void removeDuplicates() {
        // 删除数组，最简单的就是后面把前面的数据覆盖了
        int[] nums = {1, 1, 2};
        int len = nums.length;
        int num = nums[0];
        int sum = 0;
        for (int i = 1; i < len; i++) {
            if (nums[i - sum] == num) {
                nums = ArrayUtils.remove(nums, i - sum);
                sum++;
            } else {
                num = nums[i - sum];
            }
        }
        System.out.println(Arrays.toString(nums));
    }

    @Test
    public void removeDuplicates1() {
        // 数据覆盖
        int[] nums = {4, 5, 5, 5, 7, 7, 8};
        int i = 0;
        int len = nums.length;
        for (int j = 1; j < len; j++) {
            if (nums[i] != nums[j]) {
                i++;
                nums[i] = nums[j];
            }
        }
        System.out.println(Arrays.toString(nums));
        // {4, 5, 7, 8}
        //  0  1  2  3  从0号位置开始计，下一个不一样的数据位置
        // 因为数组已经排序，相同数字都连在一起，所以要找出和第一个不一样的数字排在第二位，和第二位数字不一样的数字排在第三位

    }

    @Test
    public void test() {
        int[] nums = {4, 5, 7, 1, 3, 2, 6};
        int temp = 0;
        for (int i = 1; i < nums.length; i++) {
            for (int j = i; j > 0; j--) {
                // 小 到 大
                if (nums[j] < nums[j - 1]) {
                    temp = nums[j - 1];
                    nums[j - 1] = nums[j];
                    nums[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(nums));
    }

    @Test
    public void test1() {
        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);

    }
}
